Modelos

Presenter Notes

Modelos

Los modelos encapsulan la información referente al dominio de la aplicacion web. Compuestos por campos generalemnte cada modelo mapea a una unica tabla de la base de datos.

  • Cada modelo es una clase en Python que hereda de django.db.models.Model.

  • Cada atributo del modelo se corresponde con una columna en la base de datos.

  • Con esto Django genera automaticamente una API de acceso a datos.

Bases de datos

Django tiene 4 backends oficiales MySQL, SQLite, Postgres y Oracle.

Existen otros backends creados por la comunidad para Firebird, ODBC, SQL Server y bases de datos no relacionales.

Presenter Notes

Modelos - Campos

Básicos

  • BooleanField
  • CharField
  • TextField
  • IntegerField
  • FloatField
  • DateTimeField

Relaciones

  • ForeignKey
  • ManyToManyField
  • OneToOneField

Plus

  • EmailField
  • DateField
  • TimeField
  • SlugField
  • FileField
  • ImageField
  • CommaSeparatedIntegerField
  • IPAddressField
  • UrlField

Presenter Notes

Modelos - Ejemplo

 1 class Persona(models.Model):
 2     nombre = models.CharField(max_length=50)
 3 
 4 
 5 class Mascota(models.Model):
 6     # Constantes
 7     MACHO, HEMBRA = 'm', 'h'
 8     SEXO_CHOICES = (
 9         (MACHO, 'Macho'), (HEMBRA, 'Hembra')
10     )
11     duenio = models.ForeignKey(Persona, null=True, blank=True)
12     raza = models.ForeignKey('Especie') # Relación hacia adelante
13     sexo = models.CharField(max_length=1, choices=SEXO_CHOICES)
14 
15 class Especie(models.Model):
16     nombre = models.CharField(max_length=50)
17     domesticable = models.BooleanField(default=True)
18 
19 
20 class Raza(models.Model):
21     nombre = models.CharField(max_length=50)
22     especie = models.ForeignKey(Especie)

Presenter Notes

Ejemplos - Contiunación

Validación

1 python manage.py validate
2 
3 0 errors found

Creación de tablas

1 python manage.py syncdb
2 
3 Creating table common_persona
4 Creating table common_mascota
5 Creating table common_especie
6 Creating table common_raza

Presenter Notes

Equivalencia en SQL

Presenter Notes

Equivalencia SQL

 1 BEGIN;
 2 CREATE TABLE "common_persona" (
 3     "id" integer NOT NULL PRIMARY KEY,
 4     "nombre" varchar(50) NOT NULL
 5 );
 6 CREATE TABLE "common_mascota" (
 7     "id" integer NOT NULL PRIMARY KEY,
 8     "duenio_id" integer REFERENCES "common_persona" ("id"),
 9     "raza_id" integer NOT NULL,
10     "sexo" varchar(1) NOT NULL
11 );
12 CREATE TABLE "common_especie" (
13     "id" integer NOT NULL PRIMARY KEY,
14     "nombre" varchar(50) NOT NULL,
15     "domesticable" bool NOT NULL
16 );
17 CREATE TABLE "common_raza" (
18     "id" integer NOT NULL PRIMARY KEY,
19     "nombre" varchar(50) NOT NULL
20 );
21 COMMIT;

Y esto sin contar los índices!

Presenter Notes

Modelos - Uso

Los modelos tiene herdean muchos métodos de models.Model, como save() y delete()

 1 from miapp.models import Persona
 2 
 3 p = Persona(nombre='Dundee')
 4 p.save()
 5 
 6 p.id
 7 # -> 1
 8 
 9 p.save()
10 p.id
11 # -> 1
12 
13 q = Persona()
14 q.nombre = 'Anonio'
15 # -> None
16 q.save()
17 
18 q.nombre = 'Antonieta'
19 q.save()
20 q.delete()

Presenter Notes

Otras opciones para los modelos

  1. Al ser clases los modelos pueden tener métodos que efectuen alguna acción en función de los datos que contengan, por ejemplo, la representación como cadena:

    1 class Persona(models.Model):
    2     nombre = models.CharField(max_length=50)
    3     def __unicode__(self):
    4         return "Soy %s" % self.nombre
    
  2. Metainformación Permite agregar información como el nombre de la tabla en la base de datos, una etiqueta de texto, orden por defecto, restricciones de unicidad, etc.

    1 class Registro(models.Model):
    2     fecha = models.DateField()
    3     class Meta:
    4         verbose_name = "Registro de actividad"
    5         verbose_name_plural = "Registros de actividad"
    6         ordering = '-fecha'
    

Presenter Notes

Managers

Django provee una propiedad en todos los modelos que nos permite hacer SELECT, INSERT, UPDATE y DELETE muy facilmente.

1 Persona.objects.create(nombre='Jose')
2 
3 Persona.objects.filter(nombre__istartswith='jos')
4 
5 mascotas = Mascota.objects.exclude(sexo=Mascota.MACHO)
6 
7 mascotas.filter(raza=Raza).delete()

Presenter Notes

Managers (cont)

Evaluación perezoa

Los managers devuelven objetos del tipo QuerySet con el SQL calculado pero no evaluado (no se ejecutó sobre la base), cuando se recorre por primera vez, se ejecuta la consulta.

Presenter Notes

Aplicaciones de terceros

Presenter Notes

Por que utilizar aplicaciones de 3ros

Si bien django provee un buen numero de características como

  • ORM
  • Sesiones, autenticación y autorización
  • Gestión de email
  • Mensajes
  • GIS
  • Administración automática

disponemos de muchos paquetes de 3ros que se instalan con pip y proveen extensiones, comandos, template tags, vistas genericas, etc.

Presenter Notes

Las aplicaciones de terceros ahorran mucho tiempo.

Presenter Notes

South

Presenter Notes

Que hace?

Permite manejar versiones de base de datos. Faclita el desarrollo iterativo incremental, permitiendo aumentar minimizar el uso de SQL al momento de modificar los modelos.

Provee comandos de manage.py para:

  1. Analiza las diferencias entre models.py y la base de datos y genera un script de migración

  2. Aplica o desaplica migraciones de esquema (estructura)

  3. Convierte aplicaciones que no usen South, en aplicaciones con South

  4. Aplica o desaplica migraciones de datos (estructura)

2 y 4 son transparentes

Presenter Notes

Instalación y uso

Se instala con pip en nuestro ambiente

1 pip install South

Se agrega como una aplicación instalada en setting.py en la lista de INSTALLED_APPS.

1 INSTALLED_APPS = (
2     ...
3     'south',
4 )

Presenter Notes

 1 # Convertir a South
 2 python manage.py convert_to_south common
 3 
 4 # Crear una migración
 5 python manage.py schemamigration common --auto
 6 
 7 # Aplicar una migración
 8 python manage.py migrate common
 9 
10 # Listar
11 python manage.py migrate common --list
12 
13 # Vovler a algún estado de la base de atos
14 python manage.py migrate common 001

Presenter Notes

Django Debug Toolbar

Presenter Notes

Presenter Notes